#ifndef __67DCBB6C_07D9_4d43_8E1A_E17D9D185BAF__
#define __67DCBB6C_07D9_4d43_8E1A_E17D9D185BAF__

#include "../import/head.h"
#include "../tools/head.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos
{

    class file_impl;

    // 
    // dir_impl
    // 
    class dir_impl : public xos_stl::mem_pool_item< dir_impl, thread_lock >,
        public i_dir
    {
    public:
        dir_impl();
        ~dir_impl();

    protected:
        typedef std::list< file_impl * > FILE_LIST;
        typedef FILE_LIST::iterator      FILE_ITER;
        FILE_LIST m_file_list;
        int clear_list( FILE_LIST & file_list );

    public:
        int init();
        int term();

    public:
        //////////////////////////////////////////////////////////////////////////////////
        // 
        // get full file name path
        // 
        int get_file_path( char * lpszPath, int nLen, const char * lpszFile );

        // 
        // create dir and sub dirs
        // 
        int create_directory( const char * lpszPath );

        // 
        // delete dir and sub dirs
        // 
        int delete_directory( const char * lpszPath );

        // 
        // if a dir exists
        // 
        int is_dir_exist( const char * lpszPath );

        //////////////////////////////////////////////////////////////////////////////////
        // 
        // clear last result and find with lpszPath filter
        // 
        int begin_find_file( const char * lpszPath );

        // 
        // finish find with filter
        // 
        int end_find_file();

        // 
        // get find results one by one. this will remove i_file from inner i_file list.
        // user should release i_file
        // 
        int get_find_result( i_file ** ppFile );

        //////////////////////////////////////////////////////////////////////////////////
        // 
        // if a file exists
        // 
        int is_file_exist( const char * lpszFileName );

        // 
        // delete a file
        // 
        int delete_file( const char * lpszFileName );

        // 
        // get file size
        // 
        int get_file_size( const char * lpszFile, xos_i64 * lpSize64 );

        // 
        // rename a file
        // 
        int rename_file( const char * lpszDesName, const char * lpszSrcName );

        // 
        // release
        // 
        int release();
    };
} // xos

#endif // __67DCBB6C_07D9_4d43_8E1A_E17D9D185BAF__
